tg-me.com/csharpproglib/5856
Last Update:
WeakReference
«отпустила» объект
В .NET слабые ссылки позволяют ссылаться на объект, не препятствуя сборщику мусора его удалить. Это полезно в кэшах, пулах объектов и других случаях, где важно избегать утечек памяти.
Но как проверить, что объект удаляется?
Можно использовать пример:
class MyObject
{
~MyObject()
{
Console.WriteLine("MyObject был удалён сборщиком мусора");
}
}
class Program
{
static void Main()
{
WeakReference weakRef = test();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.WriteLine("После сборки мусора: " + (weakRef.IsAlive ? "Жив" : "Удалён"));
}
static WeakReference test() {
var obj = new MyObject();
WeakReference weakRef = new WeakReference(obj);
Console.WriteLine("До удаления ссылки: " + (weakRef.IsAlive ? "Жив" : "Удалён"));
return weakRef;
}
}
•
IsAlive
показывает, жив ли объект.•
GC.Collect()
+ GC.WaitForPendingFinalizers()
заставляют сборщик мусора немедленно освободить неиспользуемые объекты.• Деструктор
~MyObject()
позволяет наглядно убедиться, что объект удалён.Метод
IsAlive
может показывать, что объект жив даже после GC.Collect()
, если объект ещё не финализирован или находится в очереди на финализацию.Для надёжности можно использовать
TryGetTarget
вместо IsAlive
.